import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/dist/query/react';

// 创建Api对象
// createApi()用来创建RTKQ中的API对象
// RTKQ的所有功能都需要通过该对象来进行
// createApi()需要一个对象作为参数
const studentApi = createApi({
  reducerPath: 'studentApi',//Api的标识，不能和其他的Api或reducer重复
  baseQuery: fetchBaseQuery({
    baseUrl: 'http://localhost:1337/api/'
  }),// baseQuery指定查询的基本信息，发送请求使用的工具
  tagTypes: ['student', 'teacher'],// 用来指定Api中的标签
  //fetchBaseQuery是RTKQ请求的简单封装
  endpoints(build) {
    // build 请求构建器，通过build设置请求相关信息
    return {
      // 获取所有学生
      getStudents: build.query({
        query() {
          // query 用来指定请求子路径
          return 'students';
        },
        // 转换返回的响应数据格式
        transformResponse(res) {
          return res.data
        },
        providesTags: [{ type: 'student', id: 'LIST' }, 'teacher'],// 当其中一个标签失效时，就重新请求数据
      }),// query -- 查询
      updateStudent: build.mutation(),// mutation -- 修改
      getStudentById: build.query({
        query(id) {
          return `students/${id}`;
        },
        keepUnusedDataFor: 0,// 设置数据缓存时间，单位秒 默认60s
        providesTags: (id) => [{ type: 'student', id: id }]
      }),
      delStudent: build.mutation({
        query(id) {
          // 如果发送不是get请求，需要返回一个对象来设置请求的信息
          return {
            url: `students/${id}`,
            method: 'delete'
          }
        },
        // invalidatesTags: ['student'],// 使标签失效，让其他标记了的请求重新发送
        // invalidatesTags: (result, error, id) => [{ type: 'student', id: id }],// 只是让student标签下相对应id的失效
        invalidatesTags: [{ type: 'student', id: 'LIST' }]
      })
    };
  },// endpoints用来指定Api的各种功能，是一个方法，需要一个对象作为返回值
});

// Api对象创建后，对象中会根据各种方法自动生成对应的钩子函数
// 通过这些钩子行数，可以向服务器发送请求
// 钩子函数的命名规则， getStudents --> useGetStudentsQuery,  updateStudent --> useUpdateStudentMutation
export const {
  useGetStudentsQuery,
  useUpdateStudentMutation,
  useGetStudentByIdQuery,
  useDelStudentMutation
} = studentApi

export default studentApi